﻿using System;
// 事件访问器是对+=和-=功能的实现。默认情况下，访问器由编译器隐式实现。
namespace _096_事件访问器
{
    class Program
    {
        //public event EventHandler PriceChanged;
        //编译器把它转换为：
        //    一个私有的委托字段
        //    一对公有的事件访问器函数，它实现私有委托字段的+=、-=运算
        //可以通过明确定义事件访问器来替代这个过程。
        //下面是手动实现前面实例中的PriceChanged事件：
        private EventHandler _priceChanged; // 声明一个私有委托
        public event EventHandler PriceChanged
        {
            add { _priceChanged += value; }
            remove { _priceChanged -= value; }
        }
        //本例和C#的默认访问器实现了同样的功能（但C#还能保证更新委托时的线程安全）通过自定义事件访问器，指示C#不要产生默认的字段和访问器逻辑。
        // 显示定义的事件访问器，可以在委托的存储和访问上进行更复杂的操作。有以下三种常用情形：
        //    当事件访问器仅为广播该事件的另一个类作交接。
        //    当类定义了大量事件，而大部分时间有很少订阅者，例如Windows控件。这种情况下，最好在字典中存储订阅者的委托实例，因为字典比大量的空委托字段的引用需要更少的存储开销。
        //    当显式实现声明事件的接口时。

        //下面示例阐明了第三种情形：
        public interface IFoo { event EventHandler Ev; }
        class Foo : IFoo
        {
            private EventHandler ev;
            event EventHandler IFoo.Ev
            {
                add { ev += value; }
                remove { ev -= value; }
            }
        }
        //提示：事件的add和remove部分被编译成add_XXX和remove_XXX方法。
        static void Main(string[] args)
        {
        }
    }
}